/**
 * 
 */
package com.app.utils.base.http;

import com.app.utils.base.j2se.StringHandler;
import com.app.utils.spring.config.SystemError;

import java.math.BigInteger;

/**
 * Mcode转换
 * 
 * <li>32进制10进制相互转换</li>
 * 
 * @author qiuxiaoj@163.com
 * @date 2020年3月20日
 *
 */
public class McodeHandler {
	private static final int[] PRIME_NUMS = { 2, 3, 5, 7, 11, 13, 17, 19, 23, 29 };
	/** 默认增量 */
	private static final int INCR_NUM = 45379;

	/**
	 * 10进制Mcode转32进制
	 * 
	 * @param mcode
	 * @return
	 */
	public static String to32Radix(long mcode) {
//		if (mcode == 0) {
//			return "";
//		}
		if (mcode < 0) {
			/** 不能为负数 */
			SystemError.wrapBs("6000", "用户信息异常");
		}
		BigInteger newCodeNum = BigInteger.valueOf(mcode).add(BigInteger.valueOf(INCR_NUM));
		BigInteger lastNum = newCodeNum.mod(BigInteger.TEN);
		int primeNum = PRIME_NUMS[lastNum.intValue()];
		BigInteger newNum = newCodeNum.multiply(BigInteger.valueOf(primeNum)).multiply(BigInteger.TEN).add(lastNum);
		return RadixConvert2.from10To32(newNum);
	}

	/**
	 * 32进制Mcode转10进制
	 * 
	 * @param mcode
	 * @return
	 */
	public static long from32Radix(String mcode) {
		if (StringHandler.isEmpty(mcode) || "0".equals(mcode) || "undefined".equals(mcode.toLowerCase())) {
			return 0;
		}
		mcode = mcode.toUpperCase();
		BigInteger bigNum = RadixConvert2.from32To10(mcode);
		BigInteger lastNum = bigNum.mod(BigInteger.TEN);
		int primeNum = PRIME_NUMS[lastNum.intValue()];
		BigInteger normalNum = bigNum.subtract(lastNum).divide(BigInteger.TEN.multiply(BigInteger.valueOf(primeNum)))
				.subtract(BigInteger.valueOf(INCR_NUM));
		if (BigInteger.valueOf(Long.MAX_VALUE).compareTo(normalNum) < 0 || normalNum.compareTo(BigInteger.ZERO) < 0) {
			/** 转换后值大于long的最大值，或者小于0 */
			SystemError.wrapBs("6000", "用户信息异常");
		}
		return normalNum.longValue();
	}

}
